#include <STC89C5xRC.H>
#include "Delay.h"
#include "DS18B20.h"
#include "LCD1602.h"
#include "Key.h"
#include "AT24C02.h"
#include "Timer0.h"
#include "Buzzer.h"

float T,TShow;
char TLow,THigh;
unsigned char KeyNum;

void main()
{	
	//读出存放的温度阈值
	THigh=AT24C02_ReadByte(0);
	TLow=AT24C02_ReadByte(1);
	//数据非法判断
	if(THigh > 125 || TLow < -55 || THigh<=TLow){THigh=20;TLow=15;}
	//先进行一次温度转换，避免上电会显示默认温度
	DS18B20_ConvertT();
	Delay(750);
	
	LCD_Init();
	
	LCD_ShowString(1,1,"T:");
	LCD_ShowString(2,1,"TH:");
	LCD_ShowString(2,9,"TL:");
	
	Timer0_Init();
	while(1)
	{	
		//获取键码
		KeyNum=Key();
		
		/*温度读取及显示*/
		DS18B20_ConvertT();
		T=DS18B20_ReadT();
		if(T<0)
		{
			LCD_ShowChar(1,3,'-');
			TShow=-T;
		}
		else
		{
			TShow=T;
			LCD_ShowChar(1,3,'+');
		}
		LCD_ShowNum(1,4,TShow,3);
		LCD_ShowChar(1,7,'.');
		LCD_ShowNum(1,8,(unsigned long)(TShow*100)%100,2);
		
		/*阈值判断及显示*/
		if(KeyNum)
		{
			if(KeyNum==1)
			{
				THigh++;
				if(THigh>125){THigh=125;}
			}
			if(KeyNum==2)
			{
				THigh--;
				if(THigh<=TLow){THigh++;}
			}
			if(KeyNum==3)
			{
				TLow++;
				if(TLow>=THigh){TLow--;}
			}
			if(KeyNum==4)
			{
				TLow--;
				if(TLow<-55){TLow=-55;}
			}
			KeyNum=0;
			//将温度阈值存入EEPROM中防止掉电丢失数据
			AT24C02_WriteByte(0,THigh);
			Delay(5);
			AT24C02_WriteByte(1,TLow);
			Delay(5);
		}
		LCD_ShowSignedNum(2,4,THigh,3);
		LCD_ShowSignedNum(2,12,TLow,3);
		//数据合法性判断
		if(T>=THigh)
		{
			LCD_ShowString(1,13,"OV:H");
		}
		
		else if(T<=TLow)
		{
			LCD_ShowString(1,13,"OV:L");
		}
		
		else {LCD_ShowString(1,13,"    ");}	
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x66;
	TH0 = 0xFC;
	T0Count++;
	if(T0Count==20)
	{
		T0Count=0;
		Key_Loop();
	}
}